home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
056
/
getdisks
/
getdisks.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
4KB
|
147 lines
/* getdisks.c - Grab all available disk devices and return them to you in a
* simple exec list. The list is made up of named nodes--the "names"
* being the device name.
*
* Phillip Lindsay (c) 1987 Commodore-Amiga Inc.
* You may use this source as long as the copyright notice is left intact.
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <libraries/filehandler.h>
#ifdef MANX
#include <functions.h>
#include <stdio.h>
#else
#include <lattice/stdio.h>
#endif
extern struct DosLibrary *DOSBase;
/* btoc() takes a pointer to a string in BCPL format and converts it to a
* C string.
*/
void *btoc(bstring)
char *bstring;
{
register UBYTE len,count,*cstring;
cstring = (UBYTE *) bstring;
len = cstring[0];
for(count=0;count < len;count++)
cstring[count] = cstring[count+1];
cstring[count] = '\0';
}
/* GetNode() will build a node structure for you. It will append memory to the
* node structure for the node name passed.
*/
struct Node *GetNode(name,type,pri)
char *name;
UBYTE type,pri;
{
register struct Node *mynode;
register char *myname;
register UBYTE *mymemory;
register ULONG mynamesize;
mynamesize =( ((ULONG)strlen(name)) ? (ULONG)strlen(name)+1 : 0L );
mymemory = (UBYTE *)
AllocMem((ULONG)sizeof(*mynode)+mynamesize,MEMF_PUBLIC | MEMF_CLEAR);
if(!mymemory) return((struct Node *)NULL);
mynode = (struct Node *) mymemory;
if(mynamesize)
{
myname = (char *) mymemory+(ULONG)sizeof(*mynode);
strcpy(myname,name);
mynode->ln_Name = myname;
}
mynode->ln_Type = type;
mynode->ln_Pri = pri;
return(mynode);
}
/* This function assumes you used GetNode() for node initialization. Will
* free all memory used by node. Make sure you remove node from any list.
*/
void FreeNode(mynode)
struct Node *mynode;
{
register ULONG mymemsize;
mymemsize = (ULONG) sizeof(*mynode);
mymemsize+= ((mynode->ln_Name) ? (ULONG)strlen(mynode->ln_Name)+1 : 0L);
FreeMem(mynode,mymemsize);
}
/* getdisks() will grab all disk device names in the system device list and
* append an exec node to a given list. The node being named in respect to the
* device.
*/
void getdisks(dlist)
struct List *dlist; /* passed a pointer to a initialize exec list */
{
extern struct DosLibrary *DOSBase;
struct RootNode *rnode;
struct DosInfo *dinfo;
register struct DeviceNode *dnode;
register struct Node *adisk;
char *bname,name[32];
rnode = (struct RootNode *) DOSBase->dl_Root;
dinfo = (struct DosInfo *) BADDR(rnode->rn_Info);
Forbid();
for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo);BADDR(dnode);
dnode = (struct DeviceNode *) BADDR(dnode->dn_Next))
{
if(!dnode->dn_Type && dnode->dn_Task && BADDR(dnode->dn_Name))
{
bname = (char *) BADDR(dnode->dn_Name);
movmem(bname,name,(ULONG)bname[0]+1L);
btoc(name);
if((adisk=GetNode(name,0,0))) AddTail(dlist,adisk);
}
}
Permit();
}
/* freedisks() will free all nodes in a given list. Function assumes nodes where
* initialized with GetNode().
*/
void freedisks(dlist)
struct List *dlist;
{
register struct Node *disk;
while((disk=RemTail(dlist)))
FreeNode(disk);
}
main()
{
struct List disks;
struct Node *disk;
NewList(&disks); /* Initialize list header */
getdisks(&disks); /* Fill list */
/* print any devices in list.... if any */
if(disks.lh_TailPred != &disks)
for(disk = disks.lh_Head;disk->ln_Succ;disk=disk->ln_Succ)
puts(disk->ln_Name);
freedisks(&disks);
}